package btc.backend.clasificador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import btc.backend.process.ConnectionFactory;
import btc.backend.servicios.BloqueAppl;
import btc.backend.servicios.PalletAppl;
import btc.model.Bloque;
import btc.model.ClasificacionPallet;
import btc.model.Pallet;

public class ClasificadorDePalletPorMuestrasYUmbral implements ClasificadorDePallet {

	public void clasificar(Pallet pallet, int cantidadDeMuestras, float umbralPrimera, float umbralSegunda) {
		List<Bloque> bloques = new BloqueAppl().obtenerBloquesPorPallet(pallet);
		
		List<Bloque> bloquesAClasificar = new ArrayList<Bloque>();
		
		for (int i = 0; i < cantidadDeMuestras; i++) {
			Integer numeroBloque = (int) Math.floor(Math.random()*(bloques.size()-1));
			bloquesAClasificar.add(bloques.get(numeroBloque));
		}
		
		int cantidadBloquesPrimera = 0;
		int cantidadBloquesSegunda = 0;
		int cantidadBloquesParaDesechar = 0;
		
		for (Bloque bloqueActual : bloquesAClasificar) {
			int ancho = bloqueActual.getAncho();
			int alto = bloqueActual.getAlto();
			int largo = bloqueActual.getLargo();
			
			if((ancho>= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
					(ancho<= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
					(alto>= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
					(alto<= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
					(largo>= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
					(largo<= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD))
			{
				bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_PRIMERA_CALIDAD);
				cantidadBloquesPrimera++;
			}
			else if((ancho>= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
					(ancho<= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
					(alto>= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
					(alto<= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
					(largo>= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
					(largo<= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD))
			{
				bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_SEGUNDA_CALIDAD);
				cantidadBloquesSegunda++;
			}
			else
			{
				bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_PARA_DESECHO);
				cantidadBloquesParaDesechar++;						
			}
				
		}
		
		//TODO borrar esto
		for (Bloque b : bloquesAClasificar) {
		
			System.out.println(b.getId()+" ;AN: "+ b.getAncho()+" ;AL: "+ b.getAlto()+" ;L: "+ b.getLargo()+ " ;CLASIF: "+ b.getClasificacion());
		}
		System.out.println("\nResultados Clasificacion:");
		System.out.println("PRIMERA = " + cantidadBloquesPrimera);
		System.out.println("SEGUNDA = " + cantidadBloquesSegunda);
		System.out.println("DESECHO = " + cantidadBloquesParaDesechar);
				
		float porcentajePrimera = (float)cantidadBloquesPrimera/cantidadDeMuestras;
		float porcentajeSegunda = (float)cantidadBloquesSegunda/cantidadDeMuestras;
		
		System.out.println("\n%Primera = " + porcentajePrimera);
		System.out.println("%Segunda = " + porcentajeSegunda);
		System.out.println("UmbralPrimera = " + umbralPrimera);
		System.out.println("UmbralSegunda = " + umbralSegunda);
				
		String clasificacionPallet = ClasificacionPallet.INSERVIBLE;
		String clasificacionBloque = ClasificadorDePallet.BLOQUE_PARA_DESECHO;
		
		if(porcentajePrimera >= umbralPrimera){
			clasificacionPallet = ClasificacionPallet.PRIMERA;
			clasificacionBloque = ClasificadorDePallet.BLOQUE_PRIMERA_CALIDAD;
		}
		else if (porcentajeSegunda + porcentajePrimera >= umbralSegunda){
			clasificacionPallet = ClasificacionPallet.SEGUNDA;
			clasificacionBloque = ClasificadorDePallet.BLOQUE_SEGUNDA_CALIDAD;
		}
		
		new PalletAppl().actualizarClasificacionDePallet(pallet.getId(), clasificacionPallet);
		
		
		try {
			Connection conexion = ConnectionFactory.getConnection();
			PreparedStatement updateBloqueSt = conexion.prepareStatement("update bloque set clasificacion = ? where id_pallet = ?");
			updateBloqueSt.setString(1, clasificacionBloque);
			updateBloqueSt.setLong(2, pallet.getId());
			
			updateBloqueSt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
